import {
  AppComponentType,
  AppFormSchema,
  AppFormProps,
} from './../../model/generator/appFormConfig';
import { ComponentType, SubFormColumn } from '/@/components/Form/src/types';
import {
  CardComponentProps,
  FormProps,
  FormSchema,
  GridComponentProps,
  TabComponentProps,
} from '/@/components/Form';
import { ComponentOptionModel, FormJson } from '/@/model/generator/codeGenerator';
import { uploadApi } from '/@/api/sys/upload';
import { camelCaseString } from '/@/utils/event/design';
import { ColumnType } from '/@/components/Designer/src/types';
import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n();
export const displayColumn = ['grid', 'form', 'divider'];
export const replaceColumn = ['select', 'radio', 'checkbox', 'cascader', 'upload'];

/**
 *
 * @param json 表单设计json
 * @param convertCamel 是否需要转换 表名和字段名
 * @returns
 */
export function buildOption(json: FormJson, convertCamel = true): FormProps {
  const { list, config, hiddenComponent } = json;
  const formSchema = buildFormScheme(list, convertCamel);
  const formProp: FormProps = {
    labelCol: config.labelCol,
    labelAlign: config.labelAlign,
    layout: config.layout,
    size: config.size,
    schemas: formSchema,
    showActionButtonGroup: false,
    buttonLocation: config.buttonLocation ? config.buttonLocation : 'center',
    actionColOptions: {
      span: 24,
    },
    showResetButton: false,
    showSubmitButton: false,
    hiddenComponent,
  };

  return formProp;
}

export function buildFormScheme(list: ComponentOptionModel[], convertCamel: boolean): FormSchema[] {
  const componentsoptions: FormSchema[] = list.map((item) => {
    if (item.type === 'divider') {
      const dividerSchema: FormSchema = {
        key: item.key,
        field: '',
        label: item.label,
        colProps: {
          span: 24,
        },
        type: item.type,
        component: 'Divider',
        componentProps: {
          dashed: false, //是否虚线
          orientation: item.options!.orientation,
          text: item.options!.defaultValue,
          style: {
            marginTop: item.options!.marginTop + 'px',
            marginBottom: item.options!.marginBottom + 'px',
          },
        },
      };
      return dividerSchema;
    }

    //如果是栅格布局组件
    if (item.type === 'grid') {
      const gridSchema: FormSchema = {
        key: item.key,
        field: '',
        label: '',
        type: item.type,
        colProps: { span: 24 },
        component: buildComponentType(item.type) as ComponentType,
        children: [],
        componentProps: item.options,
      };
      item.layout?.map((el) => {
        const gridProps: GridComponentProps = {
          span: el.span,
          list: [],
        };

        gridProps.list = buildFormScheme(el.list, convertCamel);
        gridSchema.children?.push(gridProps);
      });
      return gridSchema;
    }
    //如果是子表单布局组件
    if (item.type === 'form') {
      const formSchema: FormSchema = {
        key: item.key,
        label: item.label,
        field: (convertCamel ? camelCaseString(item.bindTable) : item.bindTable) + 'List',
        type: item.type,
        component: buildComponentType(item.type) as ComponentType,
        required: true,
        colProps: { span: 24 },
      };
      const childSchamas = item.children?.map((column) => buildSubFormSchema(column, convertCamel));
      childSchamas?.push({
        title: t('操作'),
        key: 'action',
        fixed: 'right',
        width: '50px',
      });
      formSchema.componentProps = {
        mainKey: (convertCamel ? camelCaseString(item.bindTable) : item.bindTable) + 'List',
        columns: childSchamas,
        ...item.options,
      };
      return formSchema;
    }

    //如果是子表单一对一布局组件
    if (item.type === 'one-for-one') {
      const oneForOneSchema: FormSchema = {
        key: item.key,
        label: item.label,
        field: (convertCamel ? camelCaseString(item.bindTable) : item.bindTable) + 'List',
        type: item.type,
        component: buildComponentType(item.type) as ComponentType,
        colProps: { span: 24 },
        children: [],
      };

      const childSchamas = buildFormScheme(item.children!, convertCamel);
      // const childSchamas = item.children?.map((column) => buildFormScheme(column, convertCamel));

      oneForOneSchema.componentProps = {
        mainKey: (convertCamel ? camelCaseString(item.bindTable) : item.bindTable) + 'List',
        childSchemas: childSchamas,
        ...item.options,
      };

      return oneForOneSchema;
    }

    if (item.type === 'tab') {
      const tabSchema: FormSchema = {
        key: item.key,
        field: '',
        label: '',
        type: item.type,
        colProps: { span: 24 },
        component: 'Tab',
        children: [],
        componentProps: {
          tabPosition: item.options!.tabPosition ?? 'top',
          size: item.options!.tabSize ?? 'default',
          type: item.options!.type ?? 'line',
        },
      };

      item.layout?.map((el) => {
        const tabProps: TabComponentProps = {
          span: el.span,
          name: el.name,
          list: [],
        };

        tabProps.list = buildFormScheme(el.list, convertCamel);
        tabSchema.children?.push(tabProps);
      });
      return tabSchema;
    }

    if (item.type === 'upload') {
      const uploadSchema: FormSchema = {
        key: item.key,
        field: convertCamel ? camelCaseString(item.bindField)! : item.bindField!,
        label: item.label,
        type: item.type,
        component: buildComponentType(item.type) as ComponentType,
        colProps: {
          span: 24,
        },
        componentProps: {
          api: uploadApi,
          ...item.options,
        },
      };
      return uploadSchema;
    }

    if (item.type === 'card') {
      const tabSchema: FormSchema = {
        key: item.key,
        field: '',
        label: '',
        type: item.type,
        colProps: { span: 24 },
        component: 'Card',
        children: [],
        componentProps: {
          title: item.options!.title,
        },
      };

      item.layout?.map((el) => {
        const cardProps: CardComponentProps = {
          span: el.span,
          name: el.name,
          list: [],
        };

        cardProps.list = buildFormScheme(el.list, convertCamel);
        tabSchema.children?.push(cardProps);
      });
      return tabSchema;
    }

    if (item.type === 'time-range' || item.type === 'date-range') {
      const rangeSchema: FormSchema = {
        key: item.key,
        field: `${convertCamel ? camelCaseString(item.bindStartTime!) : item.bindStartTime},${
          convertCamel ? camelCaseString(item.bindEndTime!) : item.bindEndTime
        }`,
        label: item.label,
        type: item.type,
        component: buildComponentType(item.type) as ComponentType,
        componentProps: {
          ...item.options,
          style: { width: item.options!.width },
          placeholder: [item.options!.startTimePlaceholder, item.options!.endTimePlaceholder],
        },
        colProps: { span: 24 },
      };
      return rangeSchema;
    }

    if (item.type === 'picker-color') {
      const colorPickerSchema: FormSchema = {
        key: item.key,
        field: convertCamel ? camelCaseString(item.bindField)! : item.bindField,
        label: item.label,
        type: item.type,
        component: buildComponentType(item.type) as ComponentType,
        colProps: {
          span: 24,
        },
        defaultValue: item.options!.defaultValue,
        componentProps: {
          ...item.options,
          style: { 'pointer-events': item.options!.disabled ? 'none' : 'auto' },
        },
      };
      return colorPickerSchema;
    }

    if (item.type === 'button') {
      const buttonSchema: FormSchema = {
        key: item.key,
        field: convertCamel ? camelCaseString(item.bindField)! : item.bindField,
        label: item.label,
        type: item.type,
        component: buildComponentType(item.type) as ComponentType,
        colProps: {
          span: 24,
        },
        componentProps: {
          ...item.options,
          width: item.options?.buttonWidth,
          height: item.options?.buttonHeight,
        },
      };
      return buttonSchema;
    }

    if (item.type === 'hiddenComponent') {
      const hiddenComponentSchema: FormSchema = {
        key: item.key,
        field: convertCamel ? camelCaseString(item.bindField)! : item.bindField!,
        label: item.label,
        type: item.type,
        component: buildComponentType(item.type) as ComponentType,
        colProps: {
          span: 24,
        },
        defaultValue: item.value,
      };
      return hiddenComponentSchema;
    }

    return buildSchema(item, convertCamel);
  });
  return componentsoptions;
}

export function buildSchema(model: ComponentOptionModel, convertCamel: boolean): FormSchema {
  const componentName = buildComponentType(model.type);
  const schema: FormSchema = {
    key: model.key,
    field: (convertCamel ? camelCaseString(model.bindField)! : model.bindField) || '',
    label: model.label,
    type: model.type,
    component: componentName as ComponentType,
    colProps: {
      span: 24,
    },
    defaultValue: model.options?.defaultValue,
    componentProps: {
      ...model.options,
      style: { width: model.options?.width },
    },
  };
  return schema;
}

/**
 * 构建子表单Schema
 * @param model 当前组件配置
 * @returns
 */
export function buildSubFormSchema(
  model: ComponentOptionModel,
  convertCamel = true,
): SubFormColumn {
  if (model.type === 'upload') {
    const uploadSchema: SubFormColumn = {
      key: model.key,
      dataIndex: convertCamel ? camelCaseString(model.bindField) : model.bindField,
      title: model.label,
      componentType: buildComponentType(model.type) as ComponentType,
      componentProps: {
        api: uploadApi,
        ...model.options,
      },
    };
    return uploadSchema;
  }

  if (model.type === 'time-range' || model.type === 'date-range') {
    const rangeSchema: SubFormColumn = {
      key: model.key,
      dataIndex: `${convertCamel ? camelCaseString(model.bindStartTime!) : model.bindStartTime},${
        convertCamel ? camelCaseString(model.bindEndTime!) : model.bindEndTime
      }`,
      title: model.label,
      componentType: buildComponentType(model.type) as ComponentType,
      componentProps: {
        ...model.options,
        style: { width: model.options!.width },
        placeholder: [model.options!.startTimePlaceholder, model.options!.endTimePlaceholder],
      },
    };
    return rangeSchema;
  }

  if (model.type === 'picker-color') {
    const colorPickerSchema: SubFormColumn = {
      key: model.key,
      dataIndex: convertCamel ? camelCaseString(model.bindField) : model.bindField,
      title: model.label,
      componentType: buildComponentType(model.type) as ComponentType,
      defaultValue: model.options!.defaultValue,
      componentProps: {
        ...model.options,
        style: { 'pointer-events': model.options!.disabled ? 'none' : 'auto' },
      },
    };
    return colorPickerSchema;
  }

  const column: SubFormColumn = {
    key: model.key,
    title: model.label,
    dataIndex: convertCamel ? camelCaseString(model.bindField) : model.bindField,
    componentType: buildComponentType(model.type) as ComponentType,
    defaultValue: model.options!.defaultValue,
    componentProps: model.options,
  };

  return column;
}

/**
 * 构建子表单的card  tab  grid 组件的子级 Schema
 * TODO 暂时搁浅 先不做
 *
 * @param model 当前组件配置
 * @returns
 */
export function buildSubFormChildSchema(modelList: ComponentOptionModel[]): SubFormColumn[] {
  const childSchamas = modelList.map((item) => {
    const column: SubFormColumn = {
      title: item.label,
      dataIndex: camelCaseString(item.bindField),
      componentType: buildComponentType(item.type) as ComponentType,
      defaultValue: item.options!.defaultValue,
    };

    //如果是包含自己的组件
    if (['card', 'tab', 'grid', 'form'].includes(item.type)) {
      if (['card', 'tab', 'grid'].includes(item.type)) {
        if (item.children && item.children.length > 0) {
          column.children = buildSubFormChildSchema(item.children);
        }
      }
    }

    return column;
  });

  return childSchamas;
}

export function buildComponentType(type: string): string {
  switch (type) {
    case 'input':
      return 'Input';

    case 'password':
      return 'InputPassword';

    case 'textarea':
      return 'InputTextArea';

    case 'book':
      return 'InputTextArea';

    case 'number':
      return 'InputNumber';

    case 'radio':
      return 'ApiRadioGroup';

    case 'checkbox':
      return 'ApiCheckboxGroup';

    case 'select':
      return 'XjrSelect';

    case 'cascader':
      return 'ApiCascader';

    case 'time':
      return 'TimePicker';

    case 'date':
      return 'DatePicker';

    case 'time-range':
      return 'TimeRangePicker';

    case 'date-range':
      return 'RangePicker';
    case 'rate':
      return 'Rate';

    case 'switch':
      return 'Switch';

    case 'slider':
      return 'Slider';

    case 'divider':
      return 'Divider';

    case 'upload':
      return 'Upload';

    case 'richtext-editor':
      return 'RichTextEditor';

    case 'form':
      return 'SubForm';

    case 'one-for-one':
      return 'OneForOne';

    case 'grid':
      return 'Grid';

    case 'card':
      return 'Card';

    case 'user':
      return 'User';

    case 'organization':
      return 'Dept';

    case 'info':
      return 'Info';

    case 'area':
      return 'Area';

    case 'multiple-popup':
      return 'MultiplePopup';

    case 'associate-popup':
      return 'MultiplePopup';

    case 'associate-select':
      return 'AssociateSelect';

    case 'button':
      return 'Button';

    case 'computational':
      return 'Computation';

    case 'picker-color':
      return 'ColorPicker';

    case 'title':
      return 'Title';

    case 'opinion':
      return 'Opinion';

    case 'image':
      return 'Image';

    case 'auto-code':
      return 'AutoCodeRule';

    case 'money-chinese':
      return 'MoneyChineseInput';

    case 'map':
      return 'SelectMap';

    case 'qrcode':
      return 'XjrQrcode';
    default:
      return 'Input';
  }
}

export function buildAppComponentType(type: string): AppComponentType {
  switch (type) {
    case 'input':
      return AppComponentType.input;

    case 'password':
      return AppComponentType.input;

    case 'textarea':
      return AppComponentType.input;

    case 'number':
      return AppComponentType.inputNumber;

    case 'radio':
      return AppComponentType.radio;

    case 'checkbox':
      return AppComponentType.checkbox;

    case 'select':
      return AppComponentType.select;

    case 'area':
    case 'cascader':
      return AppComponentType.cascader;

    case 'time':
      return AppComponentType.timeRange;

    case 'date':
      return AppComponentType.dateTime;

    case 'time-range':
      return AppComponentType.timeRange;

    case 'date-range':
      return AppComponentType.dateTimeRange;

    case 'rate':
      return AppComponentType.rate;

    case 'switch':
      return AppComponentType.switch;

    case 'slider':
      return AppComponentType.slider;

    case 'divider':
      return AppComponentType.divider;

    case 'upload':
      return AppComponentType.upload;

    case 'richtext-editor':
      return AppComponentType.editor;

    case 'form':
      return AppComponentType.subForm;

    case 'one-for-one':
      return AppComponentType.singleForm;

    case 'auto-code':
      return AppComponentType.autoCode;

    case 'image':
      return AppComponentType.image;

    case 'picker-color':
      return AppComponentType.color;

    case 'qrcode':
      return AppComponentType.qrcode;

    case 'title':
      return AppComponentType.title;

    case 'map':
      return AppComponentType.map;

    case 'organization':
      return AppComponentType.organization;

    case 'user':
      return AppComponentType.user;

    case 'computational':
      return AppComponentType.computation;

    case 'money-chinese':
      return AppComponentType.moneyChinese;

    case 'associate-select':
      return AppComponentType.associatePicker;

    case 'associate-popup':
      return AppComponentType.associatePopup;

    case 'multiple-popup':
      return AppComponentType.multiplePopup;

    case 'info':
      return AppComponentType.info;

    default:
      return AppComponentType.input;
  }
}

export function JavaTypeConvertTsType(type: string): ColumnType {
  switch (type) {
    case 'Integer':
      return ColumnType.NUMBER;
    case 'Long':
      return ColumnType.NUMBER;
    case 'Float':
      return ColumnType.NUMBER;
    case 'Double':
      return ColumnType.NUMBER;
    case 'BigDecimal':
      return ColumnType.NUMBER;
    case 'Short':
      return ColumnType.NUMBER;
    case 'Byte':
      return ColumnType.NUMBER;
    case 'Boolean':
      return ColumnType.BOOL;
    case 'LocalDateTime':
      return ColumnType.DATE;
    case 'LocalTime':
      return ColumnType.TIME;
    default:
      return ColumnType.STRING;
  }
}

/**
 * 将web端设计json 转换为 手机端所需要form
 */
export function buildAppFormProps(json: FormJson, convertCamel = true): AppFormProps {
  const { config, hiddenComponent } = json;
  let list = json.list;
  list = list.concat(hiddenComponent);
  const formSchema = buildAppFormScheme(list, convertCamel);
  const formProp: AppFormProps = {
    validateTrigger: 'submit',
    labelPosition: config.layout === 'vertical' || config.layout === 'inline' ? 'top' : 'left',
    labelWidth: 75,
    labelAlign: !config.labelAlign ? 'center' : config.labelAlign,
    errShowType: 'undertext',
    border: false,
    schemas: formSchema,
    rules: [],
  };

  return formProp;
}

export function buildAppFormScheme(
  list: ComponentOptionModel[],
  convertCamel: boolean,
): AppFormSchema[] {
  let schemas: AppFormSchema[] = [];

  for (const item of list) {
    if (item.type === 'divider') {
      const dividerSchema: AppFormSchema = {
        key: item.key,
        field: item.bindField,
        name: item.label,
        component: AppComponentType.divider,
        componentProps: {
          text: item.options!.defaultValue,
          align: item.options!.orientation,
        },
      };
      schemas.push(dividerSchema);

      continue;
    }

    //如果是栅格布局组件 手机端没有  必须要扁平化
    if (item.type === 'grid') {
      item.layout?.map((el) => {
        schemas = schemas.concat(buildAppFormScheme(el.list, convertCamel));
      });
      continue;
    }

    //如果是tab组件 转换为手机端配置
    if (item.type === 'tab') {
      const tabSchema: AppFormSchema = {
        key: item.key,
        name: item.label,
        component: AppComponentType.segmented,
        layout: [],
      };

      item.layout?.map((el, index) => {
        const child = {
          name: el.name,
          value: index,
          children: [] as AppFormSchema[],
        };
        child.children = buildAppFormScheme(el.list, convertCamel);
        tabSchema.layout?.push(child);
      });
      schemas.push(tabSchema);
      continue;
    }

    //如果是tab组件 转换为手机端配置
    if (item.type === 'card') {
      const cardSchema: AppFormSchema = {
        key: item.key,
        name: item.label,
        component: AppComponentType.collapse,
        layout: [],
      };

      item.layout?.map((el, index) => {
        const child = {
          name: el.name,
          value: index,
          children: [] as AppFormSchema[],
        };
        child.children = buildAppFormScheme(el.list, convertCamel);
        cardSchema.layout?.push(child);
      });
      schemas.push(cardSchema);
      continue;
    }

    //如果是子表单组件
    if (item.type === 'form' || item.type === 'one-for-one') {
      const formSchema: AppFormSchema = {
        field: (convertCamel ? camelCaseString(item.bindTable) : item.bindTable) + 'List', //字段
        key: item.key,
        name: item.label,
        component: item.type === 'form' ? AppComponentType.subForm : AppComponentType.singleForm,
        columns: [],
      };
      if (item.options?.useSelectButton !== undefined) {
        formSchema.useSelectButton = item.options.useSelectButton;
        formSchema.buttonName = item.options.buttonName;
      }
      if (item.options?.preloadType) {
        formSchema.preloadType = item.options.preloadType;
        if (formSchema.preloadType == 'dic') {
          if (item.options.itemId) formSchema.itemId = item.options.itemId;
          if (item.options.dicOptions) {
            formSchema.associateOptions = item.options.dicOptions;
          }
        } else if (formSchema.preloadType == 'api') {
          if (item.options.apiConfig?.path)
            formSchema.apiConfig = setApiConfig(item.options.apiConfig);
          if (item.options.apiConfig?.outputParams) {
            formSchema.associateOptions = item.options.apiConfig.outputParams;
          }
        }
      }
      formSchema.columns = buildAppFormScheme(item.children!, convertCamel);
      schemas.push(formSchema);
      continue;
    }

    if (item.type !== 'button') schemas.push(buildAppSchema(item, convertCamel));
  }

  return schemas;
}

export function buildAppSchema(model: ComponentOptionModel, convertCamel: boolean): AppFormSchema {
  const compType = buildAppComponentType(model.type);
  const params: any = {};
  let field = '';
  if (model.type == 'date-range' || model.type == 'time-range') {
    const start = convertCamel ? camelCaseString(model.bindStartTime!) : model.bindStartTime;
    const end = convertCamel ? camelCaseString(model.bindEndTime!) : model.bindEndTime;
    params.startTimeField = start;
    params.endTimeField = end;
    field = start + ',' + end;
  }
  if (model.options?.prestrainField) {
    params.prestrainField = model.options.prestrainField;
  }
  const rules: any = [];
  if (model.options?.required) {
    rules.push({
      required: model.options.required,
      errorMessage: model.label + '项必填',
    });
  }
  if (model.options?.rules && Array.isArray(model.options.rules)) {
    model.options.rules.forEach((o) => {
      rules.push({
        pattern: o.pattern,
        errorMessage: o.message,
      });
    });
  }
  const schema: AppFormSchema = {
    key: model.key,
    field: field
      ? field
      : (convertCamel ? camelCaseString(model.bindField)! : model.bindField) || '',
    label: model.options?.showLabel ? model.label : '',
    component: compType,
    defaultValue:
      model.type == 'hiddenComponent'
        ? model.value
        : model.type == 'number'
        ? model.options?.defaultValue > 0
          ? model.options?.defaultValue
          : 0
        : model.type == 'upload'
        ? Array.isArray(model.options?.defaultValue)
          ? ''
          : model.options?.defaultValue
        : model.options?.defaultValue || model.options?.defaultSelect,
    componentProps: buildAppComponentProps(model.type, model.options, model.key, model.bindTable),
    required: model.options?.required,
    rules: rules,
    name: model.label,
    ifShow: model.type == 'opinion' || model.type == 'hiddenComponent' ? false : true,
    dynamicDisabled: model.options?.disabled,
    ...params,
  };
  return schema;
}

export function buildAppComponentProps(type, options, key, bindTable) {
  const params: any = {};
  switch (type) {
    case 'input':
      return {
        placeholder: options.placeholder,
        prefixIcon: options.prefix,
        suffixIcon: options.suffix,
        addonBefore: options.addonBefore,
        addonAfter: options.addonAfter,
        clearable: options.allowClear,
        maxlength: options.maxlength || -1,
      };

    case 'password':
      return {
        type: 'password',
        placeholder: options.placeholder,
        prefixIcon: options.prefix,
        addonBefore: options.addonBefore,
        addonAfter: options.addonAfter,
        clearable: options.allowClear,
        maxlength: options.maxlength || -1,
      };

    case 'textarea':
      return {
        type: 'textarea',
        placeholder: options.placeholder,
        maxlength: options.maxlength || -1,
        showCount: options.showCount,
        autoHeight: options.autoSize,
        clearable: options.allowClear,
      };
    case 'number':
      return {
        min: options.min,
        placeholder: options.placeholder,
        max: options.max,
        step: options.step,
        maxlength: options.maxlength || -1,
      };
    case 'auto-code':
      return {
        autoCodeRule: options.autoCodeRule,
        placeholder: options.placeholder,
        prefixIcon: options.prefix,
        suffixIcon: options.suffix,
        addonBefore: options.addonBefore,
        addonAfter: options.addonAfter,
      };
    case 'radio':
    case 'checkbox':
    case 'select':
    case 'associate-select':
    case 'multiple-popup':
    case 'associate-popup':
      const remoteComponents = ['associate-select', 'multiple-popup', 'associate-popup'];
      if (options.datasourceType == 'staticData') {
        params.localdata = options.staticOptions;
        params.map = {
          text: options.labelField,
          value: options.valueField,
        };
      } else if (options.datasourceType == 'dic') {
        params.itemId = options.itemId;
        params.map = {
          text: options.labelField,
          value: options.valueField,
        };
        if (remoteComponents.includes(type)) {
          params.associateOptions = [...options.dicOptions];
        }
      } else if (options.datasourceType == 'api') {
        params.apiConfig = setApiConfig(options.apiConfig);
        params.map = {
          text: options.labelField,
          value: options.valueField,
        };
        if (remoteComponents.includes(type) && options.apiConfig?.outputParams) {
          params.associateOptions = [...options.apiConfig.outputParams];
        }
      }
      if (type == 'checkbox') {
        params.multiple = true;
      }
      if (type == 'radio') {
        params.mode = options.optionType;
      }
      return {
        placeholder: options.placeholder,
        ...params,
      };

    case 'area':
    case 'cascader':
      if (type == 'area') {
        params.showFormat = 'all';
        params.split = '/';
        params.selectedConfig = 'any';
        params.type = 'area';
      } else {
        params.apiConfig = setApiConfig(options.apiConfig);
        params.showFormat = options.showFormat;
        params.split = options.separator;
        params.selectedConfig = options.selectedConfig;
      }
      return {
        placeholder: options.placeholder,
        clearIcon: options.allowClear,
        ...params,
      };
    case 'slider':
      return {
        step: options.step,
        min: options.min,
        max: options.max,
      };
    case 'switch':
      return {
        checkedText: options.checkedChildren,
        unCheckedText: options.unCheckedChildren,
        checkedColor: options.checkedColor,
        unCheckedColor: options.unCheckedColor,
      };
    case 'date':
      return {
        clearIcon: options.allowClear,
        placeholder: options.placeholder,
        type:
          options.format == 'YYYY-MM-DD HH:mm:ss'
            ? 'datetime'
            : options.format == 'YYYY-MM-DD'
            ? 'date'
            : 'date',
        formatType:
          options.format == 'YYYY-MM'
            ? 'month'
            : options.format == 'YYYY'
            ? 'year'
            : options.format == 'YYYY-MM-DD HH:mm:ss'
            ? 'datetime'
            : 'date',
      };
    case 'date-range':
      return {
        type: 'daterange',
        startPlaceholder: options.startTimePlaceholder,
        endPlaceholder: options.endTimePlaceholder,
      };
    case 'time':
      return {
        placeholder: options.placeholder,
        clearable: options.allowClear,
      };
    case 'time-range':
      return {
        startTimePlaceholder: options.startTimePlaceholder,
        endTimePlaceholder: options.endTimePlaceholder,
        isRange: true,
        clearable: options.allowClear,
      };
    case 'rate':
      return {
        max: options.count,
        allowHalf: options.allowHalf,
      };
    case 'qrcode':
      if (options.codeType == 'api') {
        params.apiConfig = setApiConfig(options.apiConfig);
      } else {
        params.text = options.defaultValue;
      }
      return {
        codeType: options.codeType,
        codekey: key,
        ...params,
      };
    case 'title':
      return {
        color: options.color,
        fontSize: options.fontSize,
        align: options.align,
        title: options.defaultValue,
      };
    case 'map':
      return {
        address: options.address,
        prefixIcon: options.prefix,
        suffixIcon: options.suffix,
        latiAndLong: options.latiAndLong,
        placeholder: options.placeholder,
        bindTable: bindTable + 'List',
      };
    case 'upload':
      return {
        showType: options.listType,
        fileExtname: options.accept ? options.accept.split(',') : [],
        limit: options.maxNumber,
        multiple: options.multiple,
        maxSize: options.maxSize,
      };

    case 'organization':
      return {
        placeholder: options.placeholder,
      };

    case 'user':
      return {
        placeholder: options.placeholder,
        prefixIcon: options.prefix,
        suffixIcon: options.suffix,
      };

    case 'computational':
      return {
        placeholder: options.placeholder,
        prefixIcon: options.prefix,
        addonBefore: options.addonBefore,
        addonAfter: options.addonAfter,
        computationalConfig: options.computationalConfig,
      };

    case 'money-chinese':
      return {
        placeholder: options.placeholder,
        prefixIcon: options.prefix,
        suffixIcon: options.suffix,
        addonBefore: options.addonBefore,
        addonAfter: options.addonAfter,
        computationalConfig: options.computationalConfig,
      };
    case 'info':
      return {
        infoType: options.infoType,
        loadAgain: options.loadAgain,
      };
    default:
      return {};
  }
}
export function setApiConfig(config) {
  const data: any = {};
  data.method = config.method;
  data.path = config.path;
  data.requestParamsConfigs = [];
  data.requestHeaderConfigs = [];
  data.requestBodyConfigs = [];
  console.log(config.apiParams, 'config.apiParams');
  if (config.apiParams) {
    config.apiParams.forEach((o) => {
      if (o.key == 1 && o.tableInfo?.length) {
        o.tableInfo.forEach((element) => {
          data.requestParamsConfigs.push({
            name: element.name, //API入参名称
            dataType: element.dataType, //API入参类型
            assignmentType: element.bindType, //赋值类型
            value: element.value, //值
            config: '', //赋值配置
          });
        });
      } else if (o.key == 2 && o.tableInfo?.length) {
        o.tableInfo.forEach((element) => {
          data.requestHeaderConfigs.push({
            name: element.name, //API入参名称
            dataType: element.dataType, //API入参类型
            assignmentType: element.bindType, //赋值类型
            value: element.value, //值
            config: '', //赋值配置
          });
        });
      } else if (o.key == 3 && o.tableInfo?.length) {
        o.tableInfo.forEach((element) => {
          data.requestBodyConfigs.push({
            name: element.name, //API入参名称
            dataType: element.dataType, //API入参类型
            assignmentType: element.bindType, //赋值类型
            value: element.value, //值
            config: '', //赋值配置
          });
        });
      }
    });
  }

  return data;
}
